package com.pkche.core.advanced.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import org.springframework.web.multipart.MultipartFile;
//import org.codehaus.xfire.client.Client;

/**
 * 文件上传工具类
 *
 */
public class UploadFileUtils   {
	
	/**
	 * 创建文件夹
	 * @param directory
	 */
	public static void makeDir(String directory) {   
        File dir = new File(directory);   
        if (!dir.isDirectory()) {   
            dir.mkdirs();   
        }   
    }  
	
	/**
	 * 上传文件，提供需要上传的文件和上传的路径
	 * @param srcFile 上传源文件
	 * @param path   上传路径 
	 * @return 成功返回 filename 失败返回 error 
	 * @throws Exception 
	 */
	public static Map<String,String> uploadFile(MultipartFile srcFile,String path) throws Exception{
		Map<String,String> map = null;
		String defaultfilesize = "500";//默认文件的大小 
		int BUFFER_SIZE = 16 * 1024;
		long fileSizeTmp = 0; // 上传文件的大小
		long fileSize = 0; // 取系统的文件大小
		long tempfilesize = Integer.parseInt(defaultfilesize);
		fileSize = tempfilesize * 1024;
        String orginalfilename = srcFile.getOriginalFilename(); 
       if(orginalfilename == null || "".equals(orginalfilename)){
    	   return map;
       }
       map = new HashMap<String,String>();
       //截取后缀
       int pos = orginalfilename.lastIndexOf(".");
		String suffix = orginalfilename.substring(pos, orginalfilename.length());
       // 获得输入流：
       InputStream fin =null;
       FileOutputStream fos = null; 
       String error = "";
       try {
    	   fin = srcFile.getInputStream();
    	   fileSizeTmp = Integer.parseInt(String.valueOf(fin.available() / 1024));
    	   if (fileSizeTmp > fileSize) {
    		   error = "对不起,附件不能超过: " + fileSize + " KB ! 请重新填写";
    	   }else{
    		   	makeDir(path);
    		    // 写入文件   
	    	    String filename = generateFileName();
				path = StringUtils.combinePath( path , filename+ suffix);
				fos = new FileOutputStream(path);
				byte[] buffer = new byte[BUFFER_SIZE];   
	            while (fin.read(buffer) > 0) {
	            	fos.write(buffer);   
	            }
	            fos.flush();
	            map.put("filename", filename+ suffix);
    	   }
		} catch (Exception e) {
			e.printStackTrace();
			error = "上传文件有问题";
			throw new Exception("对不起,附件不能超过: " + fileSize + " KB ! 请重新填写");
		}finally{
			if(fin != null){
				try {
					fin.close();
				} catch (IOException e1) {
//					e1.printStackTrace();
					error = "输入流关闭问题";
				}
			}
			if(fos != null){
				try {
					fos.close();
				} catch (IOException e1) {
//					e1.printStackTrace();
					error = "输出流关闭问题";
				}
			}
		}
       if(!"".equals(error)){
    	   map.put("error", error);
       }

		return map;
	}
	/**
	 * 按当前时间和随机数生成文件名
	 * @return
	 */
	public static String generateFileName() {
		// 获得当前时间
		DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
		// 转换为字符串
		String formatDate = format.format(new Date());
		// 随机生成文件编号
		int random = new Random().nextInt(10000);
		return new StringBuffer().append(formatDate).append(random).toString();
    } 
	/**   
     * 删除文件，可以是单个文件或文件夹   
     * @param   fileName    待删除的文件名   
     * @return 文件删除成功返回true,否则返回false   
     */    
    public static boolean delete(String fileName){     
        File file = new File(fileName);     
        if(!file.exists()){     
            System.out.println("删除文件失败："+fileName+"文件不存在");     
            return false;     
        }else{     
            if(file.isFile()){     
                return deleteFile(fileName);     
            }else{     
                return deleteDirectory(fileName);     
            }     
	       }     
	    }     
    /**   
    * 删除单个文件   
     * @param   fileName    被删除文件的文件名   
    * @return 单个文件删除成功返回true,否则返回false   
     */    
   public static boolean deleteFile(String fileName){     
        File file = new File(fileName);     
        if(file.isFile() && file.exists()){     
            file.delete();     
            System.out.println("删除单个文件"+fileName+"成功！");     
            return true;     
        }else{     
            System.out.println("删除单个文件"+fileName+"失败！");     
            return false;     
        }     
    }     
         
    /**   
     * 删除目录（文件夹）以及目录下的文件   
     * @param   dir 被删除目录的文件路径   
     * @return  目录删除成功返回true,否则返回false   
     */    
    public static boolean deleteDirectory(String dir){     
        //如果dir不以文件分隔符结尾，自动添加文件分隔符      
        if(!dir.endsWith(File.separator)){     
            dir = dir+File.separator;     
        }     
        File dirFile = new File(dir);     
        //如果dir对应的文件不存在，或者不是一个目录，则退出      
        if(!dirFile.exists() || !dirFile.isDirectory()){     
            System.out.println("删除目录失败"+dir+"目录不存在！");     
            return false;     
        }     
        boolean flag = true;     
        //删除文件夹下的所有文件(包括子目录)      
        File[] files = dirFile.listFiles();     
        for(int i=0;i<files.length;i++){     
            //删除子文件      
            if(files[i].isFile()){     
                flag = deleteFile(files[i].getAbsolutePath());     
                if(!flag){     
                    break;     
                }     
            }     
            //删除子目录      
            else{     
                flag = deleteDirectory(files[i].getAbsolutePath());     
                if(!flag){     
                    break;     
                }     
            }     
        }     
             
        if(!flag){     
            System.out.println("删除目录失败");     
            return false;     
        }     
             
        //删除当前目录      
        if(dirFile.delete()){     
            System.out.println("删除目录"+dir+"成功！");     
            return true;     
        }else{     
            System.out.println("删除目录"+dir+"失败！");     
            return false;     
        }     
    }     

}
